package application;

/**
*	@(#) Select.java
*
*	Une commande concrete implementant l'interface Command.
*	Cette commande permet de realiser une selection.
*
*	@see Command
*/
public class Select implements Command {
	
	/**
	*	L'indice de debut de la selection a realiser. 
	*/
	private Integer begin=0;
	
	/**
	*	L'indice de fin de la selection a realiser. 
	*/
	private Integer end=0;
	
	/**
	*	La difference entre les indices de debut de l'actuelle et de la 
	*	precedente selection. 
	*/
	private Integer move;
	
	/**
	*	L'interface homme-machine sur laquelle est effectue la selection. 
	*/
	private UI ui;
	
	/**
	*	L'editeur sur lequel on veut realiser la selection. 
	*/
	private Editor editor;

	/**
	*	L'enregistreur dans lequel la commande sera enregistree.
	*/
	private Recorder recorder;
	
	/**
	*	Constructeur Select.
	*/
	public Select(UI ui, Editor editor, Recorder recorder) {
		this.ui=ui;
		this.editor=editor;
		this.recorder=recorder;
	}
	
	/**
	*	Lance l'execution d'une selection.
	*/
	public void execute() {	
		int startTemp=ui.getSelectionStart();
		move=startTemp-editor.getSelection().getBegin();
		begin=startTemp;
		end=ui.getSelectionEnd();
		editor.select(begin, end);
		recorder.record(this);
		if (end-begin>0) {
			ui.enableCopy();
			ui.enableCut();
		}
	}
	
	/**
	*	Lance l'execution d'une selection et remet l'interface homme-machine a jour.
	*/
	public void executeM( ) {
		editor.select(begin, end);
		ui.refresh(editor.getBuffer().getText(), editor.getSelection().getBegin(), editor.getSelection().getEnd());
	}
	
	/**
	*	@return Un memento contenant l'etat actuel de la commande.
	*/
	public Memento getMemento() {
		Memento MemSelect=MementoSelect.create();
		State s = new State(new Pair<Integer, Integer>(move,this.end-this.begin));
		MemSelect.setState(s);
		return MemSelect;
	}

	/**
	*	Restaure l'etat de cette commande.
	*
	*	@param memento
	*				Le memento contenant l'etat a restaurer.
	*/
	public void setMemento(Memento m) {
		Pair<Integer,Integer> tempPair=(Pair<Integer, Integer>)m.getState().getState();
		int mov=tempPair.getFirst();
		int length=tempPair.getSecond();
		begin=ui.getSelectionStart()+mov;
		end=ui.getSelectionStart()+mov+length;	
	}
	
}
